package com.qdu.security;

import java.util.ArrayList;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Component;

import com.qdu.entity.AlluserInfo;
import com.qdu.entity.Usert;
import com.qdu.mapper.UsertMapper;

//如果spring security验证用的用户信息来自数据库的话
//那么可以通过实现UserDetailsService接口来创建一个UserDetailsService类
//来指定验证用的用户信息如何来的
@Component
public class CustomUserDetailsService implements UserDetailsService{

	//因为需要操作user_info表，所以需要注入UserInfoMapper对象
	@Autowired
	private UsertMapper mapper;
	
	//在loadUserByUsername()方法中指定用户数据如何从数据库获取
	//将从数据库获取的用户信息和用户权限（角色）信息封装到一个UserDetails对象中返回
	@Override
	public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
		//该方法的参数username是用户在登录页面输入的用户名，会直接传入的，所以直接使用即可
		AlluserInfo user=mapper.getOneByUid1(username);
		System.out.println(username);
		//如果用户不存在，则抛出一个异常
		if(null==user)
			throw new UsernameNotFoundException("无此用户");
		
		//根据用户名查询它所有的角色的名称
		List<String> roles=mapper.selectRoleNamesById(username);
		
		//用户的角色/权限需要封装成一个List<GrantedAuthority>集合
		//才能被spring security使用
		List<GrantedAuthority> authorities=new ArrayList<>();
		for(String role:roles) {
			//需要将每个角色名称封装成一个GrantedAuthority对象
			//表示授予该用户的权限，添加到授权列表中
			//将角色封装成GrantedAuthority对象的时候，需要添加ROLE_前缀
			System.out.println(role);
			authorities.add(new SimpleGrantedAuthority("ROLE_"+role));
		}
		
		//只要将数据库中用户的信息能封装成一个UserDetails(User类为UserDetails接口的实现类)对象
		//返回，然后Spring Security就可以使用该UserDetails对象包含的用户信息进行验证和授权
		return new AlluserInfo(user.getUsername(),user.getPassword(),authorities);
		
	}
}
